//package org.dxy.infrastructure.interceptor;
//
//import lombok.extern.slf4j.Slf4j;
//import org.dxy.infrastructure.util.UserContext;
//import org.springframework.stereotype.Component;
//import org.springframework.util.StringUtils;
//import org.springframework.web.servlet.HandlerInterceptor;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//
///**
// * 用户上下文拦截器
// * 用于在请求开始时设置用户上下文，请求结束时清理用户上下文
// *
// * @author dxy
// * @createTime 2025/8/5 10:40
// */
//@Slf4j
//@Component
//public class UserContextInterceptor implements HandlerInterceptor {
//
//    /**
//     * 请求处理前执行
//     * 从请求头或其他地方获取用户信息并设置到ThreadLocal中
//     */
//    @Override
//    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        try {
//            String userId = extractUserId(request);
//            if (StringUtils.hasText(userId)) {
//                UserContext.setCurrentUser(userId);
//                log.debug("设置用户上下文: {}", userId);
//            }
//        } catch (Exception e) {
//            log.warn("设置用户上下文失败", e);
//        }
//        return true;
//    }
//
//    /**
//     * 请求处理完成后执行
//     * 清理ThreadLocal中的用户信息，防止内存泄漏
//     */
//    @Override
//    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        try {
//            UserContext.clear();
//            log.debug("清理用户上下文完成");
//        } catch (Exception e) {
//            log.warn("清理用户上下文失败", e);
//        }
//    }
//
//    /**
//     * 从请求中提取用户ID
//     * 可以根据实际项目需求修改提取逻辑
//     *
//     * @param request HTTP请求
//     * @return 用户ID
//     */
//    private String extractUserId(HttpServletRequest request) {
//        // 方式1: 从请求头获取用户ID
//        String userId = request.getHeader("X-User-Id");
//        if (StringUtils.hasText(userId)) {
//            return userId;
//        }
//
//        // 方式2: 从请求头获取用户名
//        String username = request.getHeader("X-Username");
//        if (StringUtils.hasText(username)) {
//            return username;
//        }
//
//        // 方式3: 从JWT Token中解析用户信息
//        String authorization = request.getHeader("Authorization");
//        if (StringUtils.hasText(authorization) && authorization.startsWith("Bearer ")) {
//            try {
//                // TODO: 这里可以解析JWT Token获取用户信息
//                // String token = authorization.substring(7);
//                // return JwtUtil.getUserIdFromToken(token);
//            } catch (Exception e) {
//                log.debug("从JWT Token解析用户信息失败", e);
//            }
//        }
//
//        // 方式4: 从Session中获取用户信息
//        try {
//            Object userIdObj = request.getSession().getAttribute("userId");
//            if (userIdObj != null) {
//                return userIdObj.toString();
//            }
//        } catch (Exception e) {
//            log.debug("从Session获取用户信息失败", e);
//        }
//
//        // 方式5: 从请求参数获取（不推荐，仅用于测试）
//        String paramUserId = request.getParameter("userId");
//        if (StringUtils.hasText(paramUserId)) {
//            return paramUserId;
//        }
//
//        // 如果都获取不到，返回null，MetaObjectHandler会使用默认值"system"
//        return null;
//    }
//}